import router, { resetRouter } from './index'
import NProgress from 'nprogress'
import '@/components/NProgress/nprogress.less'
import config from '@/config'
import tool from '@/utils/tool'
import api from '@/api'

import { mainStore } from '@/stores/mainStore'
import { userStore } from '@/stores/userStore'

import userRouter from '@/router/userRouter' // mock的路由
import { notification } from 'ant-design-vue'
import i18n from '@/locales'

// 设置进度条
// 是否显示右上角螺旋加载提示
NProgress.configure({ showSpinner: false })

// 免登录路由的name
const allowList = ['login', 'register', 'Frontend', 'FrontendHome']
// 默认登录路由
const loginRoutePath = '/login'
// 登录后默认进入路由
// let defaultRoutePath = config.DASHBOARD_URL
let defaultRoutePath = ''

const $t = i18n.global.t
// 判断是否已加载过动态/静态路由
let isGetRouter = false;

//设置标题
document.title = $t('self.appName')

router.beforeEach( (to, from, next) => {
    NProgress.start() // start progress bar

    // 动态标题
    document.title = to.meta.title ? `${ to.meta.title } - ` + $t('self.appName') : $t('self.appName')

    // 这两行定义的，不能放到beforeEach外面
    // 直接使用，不需要传入 pinia 实例
    const piniaMainStore = mainStore()
    const piniaUserStore = userStore()
    const routeInfo = tool.data.get(config.ROUTE_INFO_KEY)

    let token = tool.cookie.get(config.TOKEN_KEY)
    let userInfo = tool.data.get(config.USER_INFO_KEY)

    // 设置默认路由
    defaultRoutePath = tool.data.get(config.ROUTE_DEFAULT_PATH)
    if(!defaultRoutePath && routeInfo) {
        tool.data.set(config.ROUTE_DEFAULT_PATH, routeInfo[0].path)
    }
    // console.log('默认路由', defaultRoutePath)
    // console.log('beforeEach')
    if (token && userInfo) {
        //======已登录判断 start
        piniaUserStore.login(userInfo)
        // console.log('登录状态', piniaUserStore.hasLogin)

        if (to.path === loginRoutePath) {
            // 如果进入的是登录页面，进入默认页面
            next({ path: defaultRoutePath })
            NProgress.done()
        }else{
            // 这里判断了如果请求过静态路由则不再重复加载路由
            if (!isGetRouter) {
                // console.log('未获取路由')
                // api.backend.systemUser.queryLoginUserMenu.post({
                //     id: userInfo.id
                // }).then( res => {
                    // 等res.data里面的路由是正确的数据，就可以把这段放出来了，把上面的userRouter注释掉
                    // console.log('userMenus', res)
                    // console.log(res.data)
                    // const userRouter = [
                    //     ...res.data,
                    //     {
                    //         path: '/:catchAll(.*)',
                    //         redirect: '/404',
                    //         meta: {
                    //             title: "页面不存在",
                    //             showMenu: false, // 是否显示
                    //         }
                    //     },
                    // ]
                    // console.log(userRouter)
                    const data = {
                        user: {
                            permissionList: userInfo.role // 允许的路由权限，数组，如['user']
                        },
                        userMenus: userRouter,
                        allowMenus: userInfo.menus  // 允许的菜单，包含ID，直接抽出ID来组成最后的菜单
                    }
                    // console.log('permissionJs 待处理的菜单', data)
                    piniaMainStore.generateRoutes(data).then((userMenusRouter) => {
                        // 动态添加可访问路由表
                        // VueRouter@3.5.0+ New API
                        // console.log('userMenusRouter 用户路由', userMenusRouter)
                        // 设置默认路由
                        tool.data.set(config.ROUTE_DEFAULT_PATH, userMenusRouter[0].path)
                        defaultRoutePath = userMenusRouter[0].path
                        resetRouter() // 重置路由 防止退出重新登录或者 token 过期后页面未刷新，导致的
                        userMenusRouter.forEach(r => {
                            router.addRoute(r)
                        })
                        isGetRouter = true

                        // console.log('permissionJs userMenusRouter', userMenusRouter)
                        // 请求带有 redirect 重定向时，登录自动重定向到该地址
                        const redirect = decodeURIComponent(from.query.redirect || to.path)

                        // console.log('to', to)
                        // console.log('默认路由', defaultRoutePath)
                        if (to.path === redirect) {
                            // console.log('跳转到1', { ...to })
                            if(to.path === '/') {
                                next({ path: defaultRoutePath, replace: true })
                            }else{
                                next({ ...to, replace: true })
                            }
                        } else {
                            // console.log('跳转到2', redirect)
                            // 跳转到目的路由
                            next({ path: redirect })
                        }
                    })

                // }).catch(err => {
                //
                //     notification.error({
                //         message: '错误',
                //         description: '请求用户菜单信息失败，请重试'
                //     })
                //     piniaUserStore.loginOut().then(() => {
                //         isGetRouter = false
                //         // 失败时，获取用户信息失败时，调用登出，来清空历史保留信息
                //         next({ path: loginRoutePath, query: { redirect: to.fullPath } })
                //     })
                //
                // })

            }else{
                // console.log('已获取路由')
                // console.log(router.getRoutes())
                if(to.path === '/') {
                    next({ path: defaultRoutePath, replace: true })
                }else{
                    next()
                }
            }
        }
    //======已登录判断 end
    }else{
        isGetRouter = false
        // console.log('去的页面name', to.name)
        if (allowList.includes(to.name)) {
            // 在免登录名单，直接进入
            console.log('未登录，进入免登录页面')
            tool.data.set(config.ROUTE_DEFAULT_PATH, '')
            next()
        } else {
            console.log('未登录，拦截进入默认login页面')
            next({ path: loginRoutePath, query: { redirect: to.fullPath } })
            NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it
        }
    }
})

router.afterEach(() => {
    NProgress.done() // finish progress bar
})
